package com.yangrong.classloader.chapter1;

import java.util.Random;

/**
 * 主动使用的分类
 * 
 * new，直接使用
 * 访问某个类或者接口的静态变量，或者对该静态变量进行赋值操作
 * 调用静态方法
 * 反射某个类
 * 初始化一个子类
 * 启动类，比如：java HelloWorld
 * 除了上述六个以外，其余的都是被动使用，不会导致类的初始化
 * 
 * @author YangRong
 * @date 2020年7月2日
 */
public class ClassActiveUse {

	// 启动类
	static {
		System.out.println("ClassActiveUse.class");
	}

	public static void main(String[] args) throws ClassNotFoundException {

		// new，直接使用
//		new Obj();

		// 访问某个类或者接口的静态变量，或者对该静态变量进行赋值操作
//		System.out.println(I.a);
//		System.out.println(Obj.salary);

		// 调用静态方法
//		Obj.printSalary();

		// 反射某个类
//		Class.forName("com.yangrong.classloader.chapter1.Obj");

		// 初始化一个子类
//		System.out.println(Child.age);

		// 子类调用父类的static变量，子类不会被初始化
//		System.out.println(Child.salary);

		// 定义引用数组，不会初始化类
//		Obj[] arrays = new Obj[10];

		// final修饰的苍凉会在编译期间放到常量池中，不会初始化类
//		System.out.println(Obj.salary);
		// final修饰的复杂类型，在编译期间计算得出，会初始化类
		System.out.println(Obj.x);
	}

}

class Obj {

//	public static long salary = 100000L;
	
	// final修饰的引用常量
	public static final long salary = 10000L;
	// 运行期才会算出来的，导致类的初始化
	public static final int x = new Random().nextInt(100);

	static {
		System.out.println("Obj 被初始化");
	}

	public static void printSalary() {
		System.out.println("Salary");
	}
}

class Child extends Obj {
	
	public static int age = 30;
	
	static {
		System.out.println("Child 被初始化");
	}
}

interface I {
	int a = 10;
}

// 访问某个类或者接口的静态变量，或者对该静态变量进行赋值操作
// 1.对某个类的静态变量进行读写 -> class
// 2.对接口中静态变量进行读取    -> interface